//npm run html 时执行的代码。 会自动打开浏览器，并开启node服务，并开启tsc -w
//自动开启tsc -w。使用fs监听src文件夹下的代码，如果变化了，就使用webSocket通知html进行重启
//为什么不使用nodemon？ 因为我想在开启node服务的同时，开启tsc -w，这样基于增量的watch的编译速度会很快
//为什么不使用live-server？因为必须开启tsc-w，同时我想让浏览器自动打开， 如果live-server 和 tsc -w 一起使用的话，package.json无法支持两个持久性进程并发执行  （即 live-server & tsc -w 时，后面那句无效）
//使用了nodejs 的public特性，更改的如果是public里的内容，node服务无需重启，就可以获取到最新的public 内容 （tsc -w一直在检测ts代码，一有变化就更新public/js里的文件，html刷新后就能获取到最新代码）

import express from 'express';
import path from 'path'
import fs from 'fs'
import res from './src/index.js'
import { fileURLToPath } from 'url'
import { exec } from 'child_process';
import expressWs from "express-ws"
const __filenameNew = fileURLToPath(import.meta.url)
const __dirnameNew = path.dirname(__filenameNew) //esm模块需要处理__dirname才能使用
/**创建服务器的实例对象 */
const app = express()
app.use(express.static(path.join(__dirnameNew, 'public')));//指定静态资源文件夹
expressWs(app) //链接webSocket 
// 启动服务器
app.listen(8089, () => {
    console.log('\x1B[36m%s\x1B[0m', `\n服务器开启于 http://127.0.0.1:${8089}\n`);
});
exec('tsc -w');//执行tsc -w （只会执行一次，下面的热更新代码只会去叫html刷新，刷新后刚好获取到tsc -w输出的js文件，就是新代码了）
//监听文件，如果变化了就像浏览器发消息，让她重启  
let listener: fs.FSWatcher | null = null;
(app as any).ws('/socketTest', function (ws: any, req: any) {
    const file = './src'
    console.log('正在监听文件');
    if (listener) listener.close()
    listener = fs.watch(file, { recursive: true }, async function (type, name) {
        console.log('\x1B[36m%s\x1B[0m', `${file}/${name}`, type);
        await ws.send((JSON.stringify(res))) //  发送消息
    })
}) 